package com.runjian.rundo.iot.agent.common.codec;

import com.runjian.rundo.iot.agent.common.context.DeviceMessageDecodeContext;
import com.runjian.rundo.iot.agent.common.context.DeviceMessageEncodeContext;
import com.runjian.rundo.iot.agent.common.enums.SessionIdleType;
import com.runjian.rundo.iot.agent.common.message.DeviceMessage;
import com.runjian.rundo.iot.agent.common.session.Session;

import java.util.List;

/**
 * 设备消息解码器
 *
 * @author LiGang
 */
public interface DeviceMessageCodec {

    /**
     * 设备消息解码，请勿在此方法内部做耗时或异步操作
     *
     * @param messageContext 设备消息上下文对象
     * @return 解码后的设备消息
     */
    List<DeviceMessage> decode(DeviceMessageDecodeContext messageContext) throws Exception;

    /**
     * 设备消息编码，下发，现主要用于设备控制
     *
     * @param encodeContext 设备消息编码上下文对象
     */
    default void encode(DeviceMessageEncodeContext encodeContext) {

    }

    /**
     * 控制超时回调
     *
     * @param encodeContext 设备消息对象
     */
    default void downTimeOutCallback(DeviceMessageEncodeContext encodeContext) {

    }

    /**
     * 连接激活
     * 
     * @param deviceSession 连接会话
     */
    default void active(Session deviceSession) {

    }

    /**
     * 连接不活动
     *
     * @param deviceSession 连接会话
     */
    default void inactive(Session deviceSession) {

    }

    /**
     * 连接空闲
     *
     * @param deviceSession 连接会话
     */
    default void idle(Session deviceSession, SessionIdleType sessionIdleType) {

    }


}
